<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    let target = {
      name: 'shao',
      age: 18
    }

    let hanlder = {//方法之间用es6分隔
      get(target, prokey, receive) {
        if (prokey in target) {
          console.log('get success');
        }
        else {
          console.log('错误');
        }
        // get(target, propKey, receive)方法，用于拦截某个读取属性的操作,
        // 第一个参数为目标对象，第二个参数为属性名称，第三个属性为操作所针对的对象（可选参数）。
        return Reflect.get(target, prokey, receive)
      },


      set(target, prokey, value, receiver) {
        if (prokey == 'age') {
          if (!Number.isInteger(value))//integer:整数
          {
            throw new TypeError('the age is not an integer')
          }
          else {
            console.log('set\tsuccess');
          }
        }
        else {
          console.log('set\tsuccess');

        }
        return Reflect.set(target, prokey, value, receiver)
      }

    }
    // 使用方法
    let pro = new Proxy(target, hanlder)
    pro.age = 30;
    pro.name = '平安'
    console.log(pro.age);

    // 2、set(target, propKey, value, receiver),用于拦截某个属性的赋值操作，第一个参数为目标对象，
    // 第二个参数为属性名，第三个参数为属性值，第四个参数为操作行为所针对的对象（可选参数）。
  </script>
</head>

<body>
  <p>reflect</p>
  <h1>Reflect 可以用于获取目标对象的行为，它与 Object 类似，但是更易读，为操作对象提供了一种更优雅的方式。它的方法与 Proxy 是对应的。</h1>
  <h2> 2、set(target, propKey, value, receiver),用于拦截某个属性的赋值操作，第一个参数为目标对象，
    // 第二个参数为属性名，第三个参数为属性值，第四个参数为操作行为所针对的对象（可选参数）。</h2>
</body>

</html>